package de.akabahn.ebd.stw.zdxfc.prs.commande.elemente;

import static de.akabahn.ebd.stw.zdxfc.prs.ZDXFCConstants.SCHALTER_GEDREHT;
import static de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeConstants.SCHALTER_TEXT_COLOR;
import static de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeConstants.SCHALTER_TEXT_FONT;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;

import org.apache.log4j.Logger;

import de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeMain;
import de.akabahn.ebd.stw.zdxfc.prs.commande.listener.SchalterListener;

/**
 * Implementierung eines <code>Schalters</code> auf dem Bedienpult
 *
 * @author Peter Eimann
 * @since 1.0
 * @version 1.2
 */
public class Schalter extends Panel {
	private static final Logger LOG = Logger.getLogger(Schalter.class);
	private static final long serialVersionUID = -2550602633283822943L;
	
	private ZDXFCCommandeMain main;
	private String id;
	private Color circleColorAus;
	private Color circleColorAn;
	private Color lineColor;
	private Color bgColor;
	private boolean gedreht;
	private String text;
	private boolean an;
	
	/**
	 * Initialisierung des Schalters mit den uebergebenen Eigenschaften
	 * 
	 * @param id Eindeutige ID des Elements, wird fuer die Referenz auf das
	 *           Element benoetigt (die ID ist der Schluessel in den Maps, in
	 *           denen das Element gespeichert ist.
	 * @param schalterListener Die Listener-Klasse, die bei Aktionen auf dem Schalter aufgerufen wird
	 * @param circleColorAus Farbe des Schalter-Kreises bei ausgeschalteter Ausleuchtung
	 * @param circleColorAn Farbe des Schalter-Kreises bei eingeschalteter Ausleuchtung
	 * @param lineColor Farbe des Pfeils auf dem Schalter
	 * @param bgColor Hintergrundfarbe
	 * @param text Text, der zu dem Schalter dargestellt werden soll
	 * @param main Referenz auf die Hauptklasse
	 * @see SchalterListener
	 */
	public Schalter(String id, SchalterListener schalterListener, Color circleColorAus, Color circleColorAn, Color lineColor, Color bgColor, String text, ZDXFCCommandeMain main) {
		super.addMouseListener(schalterListener);
		
		this.id = id;
		this.circleColorAus = circleColorAus;
		this.circleColorAn = circleColorAn;
		this.lineColor = lineColor;
		this.bgColor = bgColor;
		this.text = text;
		this.main = main;
	}
	
	/**
	 * Zeichnet den Schalter auf dem Bedienpult mit der Farbe des Ausleuchtungszustands und dem zugehoerigen
	 * Text.
	 */
	public void paint(Graphics g) {
		setBackground(bgColor);
		g.setColor(isAn() ? circleColorAn : circleColorAus);
		g.fillOval(7, 0, 45, 45);
		
		if (!gedreht) {
			g.setColor(lineColor);
			g.fillRect(27, 2, 5, 41);
			g.fillPolygon(new int[]{29, 36, 22, 29}, new int[]{0, 12, 12, 0}, 4);
		} else {
			g.setColor(lineColor);
			g.fillRect(8, 20, 43, 5);
			g.fillPolygon(new int[]{51, 39, 39, 51}, new int[]{22, 16, 29, 22}, 4);
		}
		
		if (text != null) {
			g.setFont(SCHALTER_TEXT_FONT);
			g.setColor(SCHALTER_TEXT_COLOR);
			g.drawString(text, 13, 28);
		}
	}

	/**
	 * Gibt die ID des Elements an
	 * 
	 * @return die ID
	 */
	public String getId() {
		return id;
	}
	
	/**
	 * Gibt an, ob die Ausleuchtung des Schalters eingeschaltet ist oder nicht
	 * 
	 * @return <code>true</code> - Die Ausleuchtung ist eingeschaltet
	 */
	public boolean isAn() {
		return an;
	}

	/**
	 * Gibt an, ob der Schalter gedreht ist (eingeschaltet) oder nicht
	 * 
	 * @return <code>true</code> - Der Schalter ist gedreht
	 */
	public boolean isGedreht() {
		return gedreht;
	}

	/**
	 * Schaltet die Ausleuchtung des Schalters an
	 * 
	 * @see #paint(Graphics)
	 */
	public void ausleuchtungAn() {
		LOG.debug("Schalter " + id + ": Ausleuchtung An");
		an = true;
		repaint();
	}
	
	/**
	 * Schaltet die Ausleuchtung des Schalters aus
	 * 
	 * @see #paint(Graphics)
	 */
	public void ausleuchtungAus() {
		LOG.debug("Schalter " + id + ": Ausleuchtung Aus");
		an = false;
		repaint();
	}

	/**
	 * Dreht den Schalter hin- und zurueck (schaltet ihn Ein und Aus) und schreibt den entsprechenden Zustand
	 * in die DBD.
	 */
	public void toggleSchalter() {
		gedreht = !gedreht;
		LOG.debug("Schalter " + id + (gedreht ? " gedreht" : " zurueckgedreht"));

		if (main.isDemoMode()) {
			an = !an;
		}
		
		repaint();
		
		if (!main.isDemoMode()) {
			main.getDbd().set(id, gedreht ? SCHALTER_GEDREHT : 0);
		}
	}
}
